package com.bzkj.basicinfo.utils;

import org.springframework.stereotype.Component;

import java.security.SecureRandom;

/**
 * 生成17位不重复的编号
 */
@Component
public class UniqueIdentifierGenerator
{

    private static final SecureRandom random = new SecureRandom();
    private static final long MIN_VALUE = 1_000_000_000_000_000L; // 确保至少17位
    private static final String BASE36_CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    public String generateUniqueIdentifier()
    {
        // 使用当前时间戳（毫秒）作为基础，确保基于时间的唯一性
        long timestamp = System.currentTimeMillis();

        // 将时间戳与随机数相结合以增加唯一性
        long uniquePart = (timestamp * 36) + random.nextInt(36);

        // 确保最终值至少有17位
        if (uniquePart < MIN_VALUE) {
            uniquePart += MIN_VALUE;
        }

        // 将结果转换为Base36编码，以获得包含字母和数字的结果
        StringBuilder result = new StringBuilder(Long.toString(uniquePart, 36).toUpperCase());

        // 如果结果不足17位，则在前面补足随机字符
        while (result.length() < 17) {
            result.insert(0, BASE36_CHARS.charAt(random.nextInt(BASE36_CHARS.length())));
        }

        // 如果结果超过17位，截取前17位
        if (result.length() > 17) {
            result = new StringBuilder(result.substring(0, 17));
        }

        return result.toString();
    }
}